#include <REGX52.H>

sbit DS1302_SCLK = P3^6;
sbit DS1302_IO = P3^4;
sbit DS1302_CE = P3^5;

//Write 
#define DS1302_SECOND			0x80
#define DS1302_MINUTE			0x82
#define DS1302_HOUR				0x84
#define DS1302_DATE				0x86
#define DS1302_MONTH			0x88
#define DS1302_DAY				0x8A
#define DS1302_YEAR				0x8C
#define DS1302_WP					0x8E

/**
  * @brief  表示时间的数组（年，月，日，时，分，秒，周）
  * @param  无
  * @retval 无
  */
char DS1302_Time[]={23,2,17,7,59,55,5};

/**
  * @brief  DS1302的初始化
  * @param  无
  * @retval 无
  */
void DS1302_Init()
{
	DS1302_CE = 0;
	DS1302_SCLK = 0;
}

/**
  * @brief  DS1302写入一个字节数据
  * @param  Command 读寄存器命令字
	* @param	Data 要传入的一个字节的数据 为BCD码形式
  * @retval 无
  */
void DS1302_WriteByte(unsigned char Command,Data)
{
	unsigned char i;
	DS1302_CE = 1;
	for(i=0;i<8;i++)
	{
		DS1302_IO = Command&(0x01<<i);//取出Command的第i位
		DS1302_SCLK = 1;
		DS1302_SCLK = 0;	
	}
		for(i=0;i<8;i++)
	{
		DS1302_IO = Data&(0x01<<i);//取出Data的第i位
		DS1302_SCLK = 1;
		DS1302_SCLK = 0;	
	}
	DS1302_CE = 0;
}

/**
  * @brief  DS1302读取一个字节数据
  * @param  Command 读寄存器命令字 通过内部 |=0x01变为读命令字
	* @retval 返回值为当先选择的日期数据  为BCD码格式
  */
unsigned char DS1302_ReadByte(unsigned char Command)
{
	unsigned char i,Data=0x00;
	Command |= 0x01; //读写仅最后一位有区别，由此可将写的地址改为读的
	DS1302_CE = 1;
	for(i=0;i<8;i++)
	{
		DS1302_IO = Command&(0x01<<i);//取出Command的第i位
		DS1302_SCLK = 0;	
		DS1302_SCLK = 1;
	}
	for(i=0;i<8;i++)
	{	
		DS1302_SCLK = 1;
		DS1302_SCLK = 0;
		if(DS1302_IO){Data |= (0x01<<i);}
	}
	DS1302_CE = 0;
	DS1302_IO = 0;	
	return Data;
}

void DS1302_SetTime()
{
	DS1302_WriteByte(DS1302_WP,0x00); //解除写保护状态
	DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
	DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
	DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
	DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
	DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
	DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
	DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
	DS1302_WriteByte(DS1302_WP,0x80); //打开写保护状态
}

void DS1302_ReadTime()
{
	unsigned char Temp;
	Temp = DS1302_ReadByte(DS1302_YEAR); DS1302_Time[0] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_MONTH); DS1302_Time[1] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_DATE); DS1302_Time[2] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_HOUR); DS1302_Time[3] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_MINUTE); DS1302_Time[4] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_SECOND); DS1302_Time[5] = Temp/16*10+Temp%16;
	Temp = DS1302_ReadByte(DS1302_DAY); DS1302_Time[6] = Temp/16*10+Temp%16;
}
